#include "linkList.h"

LinkList *createLinkList() {
    LinkList *linkList = (LinkList *)malloc(sizeof(LinkList));
    if (linkList == NULL) {
        return NULL;
    }
    linkList->len = 0;
    linkList->head.value = 66;		// 可以根据具体的场景来定义这个含义
    linkList->head.next = NULL;

    return linkList;
}

void releaseLinkList(LinkList *linkList) {
    if (linkList) {
        ListNode *node = &linkList->head;
        while (node->next) {
            ListNode *tmp = node->next;
            node->next = tmp->next;
            free(tmp);
            --linkList->len;
        }
        printf("linklist have %d node!\n", linkList->len);
        free(linkList);
    }
}

/* 在指定位置上插入元素，先判断pos的合法性，遍历中发现达不到pos位置
 * 在pos位置上插入，就要找到pos - 1的位置
 * pos = 1 逻辑的位置上插入，就定义cnt = 0就是头节点
 * pos取值范围是[1...
 * */
int insertLinkList(LinkList *linkList, int pos, Element e) {
    int cnt = 0;
    ListNode *node = &linkList->head;

    if (pos < 1 || pos > linkList->len + 1) {
        printf("insert pos invalid!\n");
        return -1;
    }
    // 找到pos - 1的位置
    while (node && cnt < pos - 1) {
        node = node->next;
        ++cnt;
    }
    // node == null pos的位置正好找到
    if (node == NULL) {
        printf("insert pos bigger than link len!\n");
        return -1;
    }
    // 这里的node指向了待插入节点的前一个节点
    ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
    if (newNode == NULL) {
        return -1;
    }
    newNode->value = e;
    newNode->next = node->next;
    node->next = newNode;
    ++linkList->len;
    return 0;
}

void showLinkList(LinkList *linkList) {
    ListNode *node = linkList->head.next;
    while (node) {
        // 每个节点要做的事情
        printf("%d\t", node->value);
        node = node->next;
    }
    printf("\n");
}

int deleteLinkList(LinkList *linkList, Element e) {
    // 1. 找到e元素的前一个节点
    ListNode *node = &linkList->head;
    while (node->next && (node->next->value != e)) {
        node = node->next;
    }
    if (node->next == NULL) {
        printf("Not find element!\n");
        return -1;
    }
    // 2. 采用备份思想，实现链式删除
    ListNode *tmp = node->next;
    node->next = tmp->next;
    free(tmp);
    --linkList->len;
    return 0;
}

/* 链表倒序，将后续节点依次实现头插法
 * 先将头节点的next指向空，引入辅助指针指向第一个元素
 * 不断遍历这个辅助指针，将一个个指向的节点插入到头节点后
 * */
void reverseLinkList(LinkList *linkList) {
    ListNode *node = linkList->head.next;
    ListNode *tmp;
    linkList->head.next = NULL;

    while (node) {
        tmp = node;
        node = node->next;
        tmp->next = linkList->head.next;
        linkList->head.next = tmp;
    }
#if 0
    while (node) {
		tmp = node->next;
		node->next = linkList->head.next;
		linkList->head.next = node;
		node = tmp;
	}
#endif
}